﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ETFK
{
    /// <summary>
    /// 这个类提供在进行自动测试时的辅助函数
    /// </summary>
    public class CheckHelper
    {
        /// <summary>
        /// 测试客户答案是否按照正确答案定义了相应的方法
        /// </summary>
        /// <param name="ComputerAnswer">正确答案</param>
        /// <param name="PeopleAnswer">客户答案</param>
        /// <param name="Name">方法名称</param>
        /// <returns>是则返回True，否则返回False</returns>
        public static bool CheckMethodInfo(object ComputerAnswer,object PeopleAnswer,string Name)
        {
            //获取正确答案的方法信息
            MethodInfo mis = ComputerAnswer.GetType().GetMethod(Name);
            //获取客户答案的方法信息
            MethodInfo mid = PeopleAnswer.GetType().GetMethod(Name);

            //客户答案和正确答案是否存在名称为“Name”的方法。
            if (mis == null || mid == null)
            {
                CheckRecord.Add("方法" + Name + "未定义！");
                return false;
            }

            //正确答案方法的参数信息数组
            ParameterInfo[] pisAry = mis.GetParameters();
            //客户答案方法的参数信息数组
            ParameterInfo[] pidAry = mid.GetParameters();

            //正确答案与客户答案的参数个数是否一致
            if (pisAry.Length != pidAry.Length)
            {
               CheckRecord.Add("方法" + Name + "的参数不正确！");
               return false;
            }

            ParameterInfo pis = null;
            ParameterInfo pid = null;

            //遍历答案的参数信息数组对每个参数进行判断
            for (int i = 0; i < pisAry.Length; i++)
            {
                pis = pisAry[i];
                pid = pidAry[i];

                //参数默认值是否一致
                if (pis.DefaultValue.Equals(pid.DefaultValue)==false)
                {
                    CheckRecord.Add("方法" + Name + "的参数不正确！");
                    return false;
                }

                //参数的名称是否一致
                if (pis.Name.Equals(pid.Name) == false)
                {
                    CheckRecord.Add("方法" + Name + "的参数不正确！");
                    return false;
                }

                //参数的数据类型是否一致
                if (pis.ParameterType.Equals(pid.ParameterType) == false)
                {
                    CheckRecord.Add("方法" + Name + "的参数不正确！");
                    return false;
                }
            }
            
            //方法的返回值是否一致
            if (mis.ReturnParameter.ParameterType.Equals(mid.ReturnParameter.ParameterType) == false)
            {
                CheckRecord.Add("方法" + Name + "的返回类型不正确！");
                return false;
            }

            return true;
        }
    }
}
